package pacote;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;
import javax.persistence.EntityManager;


import org.jrimum.bopepo.BancosSuportados;
import org.jrimum.bopepo.view.BoletoViewer;
import org.jrimum.bopepo.Boleto;
import org.jrimum.domkee.comum.pessoa.endereco.Endereco;
import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa;
import org.jrimum.domkee.financeiro.banco.febraban.Agencia;
import org.jrimum.domkee.financeiro.banco.febraban.Carteira;
import org.jrimum.domkee.financeiro.banco.febraban.Cedente;
import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria;
import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta;
import org.jrimum.domkee.financeiro.banco.febraban.Sacado;
import org.jrimum.domkee.financeiro.banco.febraban.TipoDeTitulo;
import org.jrimum.domkee.financeiro.banco.febraban.Titulo;
import org.jrimum.domkee.financeiro.banco.febraban.Titulo.EnumAceite;

/**
 *
 * @author Uriel
 */

public class GeraBoleto {

    private EntityManager em;
    //private Vendas venda;

    public GeraBoleto(EntityManager exm){
        this.em = exm;

    }

    public void Gera(short idVenda){
        Vendas venda = em.find(Vendas.class, idVenda);
        Clientes c = em.find(Clientes.class, venda.getIdUser());
        List<Itemsvendas> items = venda.getItems(em);
        float valor = 0;
        for (Itemsvendas item : items){
            Produtos p = em.find(Produtos.class, item.getIdProduto());
            valor += p.getPreco();
        }
        Calendar data = Calendar.getInstance();
        data.setTime(venda.getDatap());
        data.add(Calendar.MONTH, 1);
        /*
         * INFORMANDO DADOS SOBRE O CEDENTE.
         */
        Cedente cedente = new Cedente("Fire eCOM Ltda", "00.000.208/0001-00");

        /*
         * INFORMANDO DADOS SOBRE O SACADO.
         */
        Sacado sacado = new Sacado(c.getNome(), c.getCpf());

        // Informando o endereço do sacado.
        Endereco enderecoSac = new Endereco();
        enderecoSac.setUF(UnidadeFederativa.valueOfSigla(c.getEndEst()));
        enderecoSac.setLocalidade(c.getEndCid());
        enderecoSac.setBairro(c.getEndBairro());
        enderecoSac.setLogradouro(c.getEndereco());
        enderecoSac.setNumero(""+c.getEndNum());
        sacado.addEndereco(enderecoSac);

        /*
         * INFORMANDO OS DADOS SOBRE O TÍTULO.
         */

        // Informando dados sobre a conta bancária do título.
        ContaBancaria contaBancaria = new ContaBancaria(BancosSuportados.BANCO_BRADESCO.create());
        contaBancaria.setNumeroDaConta(new NumeroDaConta(123456, "0"));
        contaBancaria.setCarteira(new Carteira(30));
        contaBancaria.setAgencia(new Agencia(1234, "1"));

        Titulo titulo = new Titulo(contaBancaria, sacado, cedente);
        titulo.setNumeroDoDocumento("123456");
        titulo.setNossoNumero("99345678912");
        titulo.setDigitoDoNossoNumero("5");
        titulo.setValor(BigDecimal.valueOf(valor));
        titulo.setDataDoDocumento(venda.getDatap());
        titulo.setDataDoVencimento(data.getTime());
        titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL);
        titulo.setAceite(EnumAceite.A);
        titulo.setDesconto(BigDecimal.ZERO);
        titulo.setDeducao(BigDecimal.ZERO);
        titulo.setMora(BigDecimal.ZERO);
        titulo.setAcrecimo(BigDecimal.ZERO);
        titulo.setValorCobrado(BigDecimal.ZERO);

        /*
         * INFORMANDO OS DADOS SOBRE O BOLETO.
         */
        Boleto boleto = new Boleto(titulo);
        boleto.setLocalPagamento("Pagável preferencialmente na Rede Bradesco ou em "
                + "qualquer Banco até o Vencimento.");
        boleto.setInstrucaoAoSacado("Pague em dia. Evite juros.");
        boleto.setInstrucao1("Não receber após o vencimento");

        /*
         * GERANDO O BOLETO BANCÁRIO.
         */
        // Instanciando um objeto "BoletoViewer", classe responsável pela
        // geração do boleto bancário.
        BoletoViewer boletoViewer = new BoletoViewer(boleto);

        // Gerando o arquivo. No caso o arquivo mencionado será salvo na mesma
        // pasta do projeto. Outros exemplos:
        // WINDOWS: boletoViewer.getAsPDF("C:/Temp/MeuBoleto.pdf");
        // LINUX: boletoViewer.getAsPDF("/home/temp/MeuBoleto.pdf");
        File arquivoPdf = boletoViewer.getPdfAsFile("BoletoVenda.pdf");

        // Mostrando o boleto gerado na tela.
        mostreBoletoNaTela(arquivoPdf);

    }

    public static void main(String[] args) {                
        }

        /**
         * Exibe o arquivo na tela.
         *
         * @param arquivoBoleto
         */

        private static void mostreBoletoNaTela(File arquivoBoleto) {

                java.awt.Desktop desktop = java.awt.Desktop.getDesktop();

                try {
                        desktop.open(arquivoBoleto);
                } catch (IOException e) {
                }
        }
}
